<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="/pages/layout/masterLayout.xhtml">
	<ui:define name="tituloPagina">Componentes JSF - Parte 1</ui:define>
	<ui:define name="conteudo">
		<h1>Navegação</h1>
		<p>A navegação em aplicações JSF é toda baseada em comandos. Cada
			componente de submit do JSF deve ser associado com um comando (uma
			String simples) ou com um método de algum Managed Bean que tem como
			retorno uma String - ou seja, o JSF sempre espera uma String (com um
			possível processamento anterior, se estiver relacionado com um MBean)
			para determinar qual será a próxima página a ser apresentada ao
			usuário.</p>
		<p>Estes comandos devem ser mapeados no arquivo
			"faces-config.xml", encontrado na pasta
			"WebContent/WEB-INF/faces-config.xml" do projeto WEB.</p>
		<p>Com este mapeamento, não é necessário ficar repetindo o caminho
			fixo das páginas durante o desenvolvimento. É possível, por exemplo,
			mapear o comando "vaiParaInicioCadastro", o qual é muito mais fácil
			de lembrar, digitar e refatorar do que o caminho completo
			"pages/pessoa/cadastro/inicioDoCadastro.xhtml"</p>
		<p>O mapeamento pode ser feito de forma genérica ou específica por
			página de origem. O mapeamento do comando "home", por exemplo, pode
			ser feito de forma genérica, pois, independente da página na qual o
			usuário se encontra, este comando deve sempre retornar o usuário para
			a página inicial do sistema.</p>
		<p>Já o comando "voltar", por exemplo, deve ser mapeado para cada
			página, pois somente ela sabe qual é a página anterior que deve ser
			re-exibida.</p>
		<p>Além da possibilidade do mapeamento ser feito por página,
			também pode ser feito por uma action (um método de um Managed Bean
			que retorna o comando de navegação). Suponha, por exemplo, que numa
			mesma página JSF existem dois botões associados com dois beans
			diferentes. Os beans foram desenvolvidos por pessoas diferentes, e os
			dois desenvolvedores tiveram a grande idéia de retornar o comando
			"sucesso" se o processamento foi executado com sucesso. É possível
			mapear que cada comando "sucesso" direcione a aplicação para uma
			página diferente.</p>
		<p>Vale lembrar também que o arquivo "faces-config.xml" é
			resposável por diversas configurações do JSF, então nos exemplos será
			exibido somente o código correspondente a navegação.</p>
		<h2>Exemplos</h2>
		<pre class="prettyprint lang-xml">&lt;navigation-rule&gt;
  &lt;navigation-case&gt;
   &lt;from-outcome&gt;index&lt;/from-outcome&gt;
   &lt;to-view-id&gt;/pages/index.xhtml&lt;/to-view-id&gt;
  &lt;/navigation-case&gt;
 &lt;/navigation-rule&gt;</pre>
		<p>Este exemplo mostra o mapeamento de um comando ("index"), que
			pode ser chamado de qualquer página e enviará o usuário para a página
			"/pages/index.xhtml"</p>
		<p>A tag "&lt;navigation-rule&gt;" indica o início de um ou mais
			mapeamentos com a mesma origem.</p>
		<p>A tag "&lt;from-view-id&gt;" (não presente neste exemplo)
			poderia ser utilizada para identificar a página de origem da
			navegação.</p>
		<p>A tag "&lt;from-outcome&gt;" indica qual é o comando a ser
			mapeado. Neste caso o comando é "index".</p>
		<p>A tag "&lt;to-view-id&gt;" indica qual é a página de destino da
			navegação.</p>
		<pre class="prettyprint lang-xml">&lt;navigation-rule&gt;
  &lt;from-view-id&gt;/pages/index.xhtml&lt;/from-view-id&gt;
  &lt;navigation-case&gt;
   &lt;from-outcome&gt;vaiParaIntroBeans&lt;/from-outcome&gt;
   &lt;to-view-id&gt;/pages/ExemplosJSF/ManagedBeans.xhtml&lt;/to-view-id&gt;
  &lt;/navigation-case&gt;
  &lt;navigation-case&gt;
   &lt;from-outcome&gt;vaiParaIntroEL&lt;/from-outcome&gt;
   &lt;to-view-id&gt;/pages/ExemplosJSF/ExpressionLanguage.xhtml&lt;/to-view-id&gt;
  &lt;/navigation-case&gt;
  &lt;navigation-case&gt;
   &lt;from-outcome&gt;vaiParaNavegacao&lt;/from-outcome&gt;
   &lt;to-view-id&gt;/pages/ExemplosJSF/Navegacao.xhtml&lt;/to-view-id&gt;
  &lt;/navigation-case&gt;
   &lt;navigation-case&gt;
   &lt;from-action&gt;btLogin&lt;/from-action&gt;
   &lt;from-outcome&gt;sucesso&lt;/from-outcome&gt;
   &lt;to-view-id&gt;/pages/index.xhtml&lt;/to-view-id&gt;
  &lt;/navigation-case&gt;
 &lt;/navigation-rule&gt;
 </pre>
		<p>Este exemplo mostra quatro regras de navegação. A origem da
			navegação sempre é na página "/pages/index.xhtml", como declarado
			pela tag "&lt;from-view-id&gt;". Os três primeiros comandos
			declarados são "vaiParaIntroBeans", "vaiParaIntroEL" e
			"vaiParaNavegacao", cada qual iniciando a navegação para a seção
			correspondente neste projeto de exemplos!</p>
		<p>
			Já o último comando, declarado como "sucesso" só será processado se a
			ação que o invocou (o componente que realizou o submit) possuir a
			expressão "
			<h:outputText value="#" />
			{loginBean.login}"
		</p>
		<p>Bom, após apresentar todas estas informações, pelo menos você
			não vai precisar se preocupar muito com edição de XMLs para
			configurar a navegação do seu site: as ferramentes de mercado mais
			utilizadas possuem editores gráficos para a criação dos mapeamentos!
			:)</p>
	</ui:define>
</ui:composition>
</html>